home *** CD-ROM | disk | FTP | other *** search
/ Precision Software Appli…tions Silver Collection 1 / Precision Software Applications Silver Collection Volume One (PSM) (1993).iso / demos / devel3.exe / RENDER.C < prev    next >
C/C++ Source or Header  |  1992-05-29  |  4KB  |  170 lines

  1. /* Written by Bernie Roehl, January 1992 */
  2. /* Redone by Dave Stampe for integer, fast polys, colors etc */
  3. /* Modified by Bernie Roehl to support surface types */
  4.  
  5. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  6.    May be freely used to write software for release into the public domain;
  7.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  8.    for permission to incorporate any part of this software into their
  9.    products!
  10.  */
  11.  
  12. /* Contact: broehl@sunee.waterloo.edu or dstampe@sunee.waterloo.edu */
  13.  
  14. #include <stdio.h>
  15. #include <graphics.h>
  16. #include <dos.h>
  17. #include "rend386.h"
  18.  
  19. extern int set_colors();        /* defined in color file */
  20. extern int reset_colors();
  21. extern int screen_clear_color;
  22. extern int wireframe_color;
  23. extern int highlight_color;
  24. extern int highest_color;
  25.  
  26.  
  27. enter_graphics()               /* enter and setup graphics screen */
  28. {
  29.     int i;
  30.  
  31.     set_gmode();
  32.     set_vidpage(0,0);
  33.     set_drawpage(0);
  34.     clr_page(0,0);
  35.     set_colors();
  36.  
  37.     return(0);
  38. }
  39.  
  40.  
  41. exit_graphics()            /* exit and restore text screen */
  42. {
  43.     exit_gmode();
  44.     reset_colors();
  45.     return 0;
  46. }
  47.  
  48. void clear_display(int pge)
  49. {
  50.     clr_page(pge,screen_clear_color);
  51. }
  52.  
  53.  
  54.  
  55. void ptpoly(int count, int *pcoords, int color)
  56. {
  57.     void fastpoly(int count, int *pcoords);
  58.     int surface_type = (color>>12)&3;
  59.  
  60.     color &= 0xFFF;
  61.  
  62.     switch (surface_type) {
  63.         case 0:
  64.         case 1:
  65.             load_color (color);
  66.             fastpoly(count, pcoords);
  67.             break;
  68.         case 2:
  69.             m_fastpoly(count, pcoords, color, 0xFF, 0x00);
  70.             break;
  71.         case 3:
  72.             m_fastpoly(count, pcoords, color, 0xAA, 0xFF);
  73.             break;
  74.         }
  75. }
  76.  
  77. /********************************************************/
  78. /* USER ROUTINES CALLED BY THE RENDERING LIBRARY        */
  79. /* KEEP THIS AS FAST AS POSSIBLE: SOME MAY BE           */
  80. /* CALLED UP TO 1000 TIMES PER SCREEN!                  */
  81. /********************************************************/
  82.  
  83. extern int wireframe;
  84.  
  85. /* USER ROUTINE TO SETUP FOR POLY DRAWING - CALLED ONCE PER FRAME */
  86. void user_setup_blitter()
  87. {
  88.     setup_hdwe(0);
  89. }
  90.  
  91. /* USER ROUTINE TO RECOVER AFTER POLY DRAWING: ONCE PER FRAME */
  92. void user_reset_blitter()
  93. {
  94.     reset_hdwe();
  95. }
  96.  
  97.  
  98. /* USER ROUTINE TO DRAW TEXT BOXES */
  99. void user_box(int x1, int y1, int x2, int y2, int color)
  100. {
  101.     setup_hdwe(0);
  102.     load_color(color);
  103.  
  104.     if (x1 < 0) x1 = 0; if (x2 < 0) x2 = 0;
  105.     if (y1 < 0) y1 = 0; if (y2 < 0) y2 = 0;
  106.     if (x1 > 319) x1 = 319; if (x2 > 319) x2 = 319;
  107.     if (y1 > 199) y1 = 199; if (y2 > 199) y2 = 199;
  108.  
  109.     fastri(x1,y1,x1,y2,x2,y1);
  110.     fastri(x2,y2,x2,y1,x1,y2);
  111.     reset_hdwe();
  112. }
  113.  
  114. /* USER ROUTINE TO DRAW TEXT */
  115. void user_text(int x, int y, int color, char *string)
  116. {
  117.     printxyc(x, y, color, string);
  118. }
  119.  
  120.  
  121. static int x1, y1;
  122. static void vlineto(int x, int y, int color)
  123. {
  124.     vgaline(x,y,x1,y1,color);
  125.     x1 = x; y1 = y;
  126. }
  127.  
  128. /* CALLED FROM HIREND TO DRAW POLYS */
  129.  
  130. void user_render_poly(int number, int *pcoords,
  131.               int color, long maxz)
  132. {
  133.     int i;
  134.  
  135.     if (number == 2)
  136.         {
  137.         vgaline(pcoords[0],pcoords[1],pcoords[2],pcoords[3],color);
  138.         return;
  139.         }
  140.     if (!wireframe)
  141.         {
  142.         ptpoly(number, pcoords, color);
  143.  
  144.         if (color & 0x8000)             /* highlighted? */
  145.             {
  146.             x1 = pcoords[0];
  147.             y1 = pcoords[1];
  148.             for (i = 1; i < number; ++i) vlineto(pcoords[i+i], pcoords[i+i+1], highlight_color);
  149.             vlineto(pcoords[0], pcoords[1], highlight_color);
  150.         }
  151.     }
  152.     else
  153.         {
  154.         x1 = pcoords[0];
  155.         y1 = pcoords[1];
  156.         for (i = 1; i < number; ++i) vlineto(pcoords[i+i], pcoords[i+i+1], wireframe_color);
  157.             vlineto(pcoords[0], pcoords[1], wireframe_color);
  158.         }
  159. }
  160.  
  161. void vgabox(int left, int top, int right, int bottom, int color)
  162. {
  163.     setup_hdwe(0);
  164.     vgaline(left, top, right, top, color);
  165.     vgaline(right, top, right, bottom, color);
  166.     vgaline(right, bottom, left, bottom, color);
  167.     vgaline(left, bottom, left, top, color);
  168.     reset_hdwe();
  169. }
  170.